package com.ysx.member.service;


import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;

import com.ysx.common.exception.BusinessException;
import com.ysx.common.exception.BusinessExceptionEnum;
import com.ysx.common.util.JwtUtil;
import com.ysx.common.util.SnowUtil;
import com.ysx.member.domain.Member;
import com.ysx.member.domain.MemberExample;
import com.ysx.member.entity.MemberCodeReq;
import com.ysx.member.entity.MemberLoginReq;
import com.ysx.member.entity.MemberRegister;
import com.ysx.member.mapper.MemberMapper;
import com.ysx.member.repentity.MemberLonginResp;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 会员服务类
 */
@Service
public class service {

    @Resource
    private MemberMapper memberMapper;




    /**
     * 用户注册
     * @param memberRegister 用户注册信息，包含手机号
     * @return 注册成功后的用户ID
     * @throws BusinessException 如果手机号已存在则抛出异常
     */
    public long register(MemberRegister memberRegister){

        String rep = memberRegister.getMobile();

        //查找手机号是否存在
        Member members = SelectByMobile(rep);
        if (ObjectUtil.isNull( members)){

            Member member = new Member();
            member.setId(SnowUtil.getSnowflakeNextId());//雪花算法
            member.setMobile(rep);
            memberMapper.insert(member);
            return member.getId();
        }
//        return members.get(0).getId();
        throw new BusinessException(BusinessExceptionEnum.MEMBER_MOBILE_EXIST);

    }

    /**
     * 获取验证码
     * 如果手机号已经注册过了就直接给验证码，
     * 如果手机号没注册过就注册然后给验证码
     * @param memberCodeReq 包含手机号的请求对象
     */
    public void sendCode(MemberCodeReq memberCodeReq){

        String rep = memberCodeReq.getMobile();

        //查找手机号是否存在
        Member members = SelectByMobile(rep);

        //如果手机号不存在
        if (ObjectUtil.isNull( members)){

            Member member = new Member();
            member.setId(SnowUtil.getSnowflakeNextId());//雪花算法
            member.setMobile(rep);
            memberMapper.insert(member);

        }/*else{
            throw new BusinessException(BusinessExceptionEnum.MEMBER_MOBILE_EXIST);
        }*/
        //生成验证码
        String s = RandomUtil.randomString(4);

        //保存短信记录表：手机号，验证码，发送时间，有效期，是否已经使用，业务类型，发送时间和使用时间

        //对接短信通道位置
    }

    /**
     * 短信验证码登录
     * @param memberLoginReq 登录请求参数，包含手机号和验证码
     * @return 登录响应对象，包含用户基本信息
     * @throws BusinessException 手机号不存在或验证码错误时抛出异常
     */
    public MemberLonginResp login(MemberLoginReq memberLoginReq){

        String rep = memberLoginReq.getMobile();
        String code = memberLoginReq.getCode();

        Member memberDB = SelectByMobile(rep);

        //如果手机号不存在
        if (ObjectUtil.isNull( memberDB)){
            throw new BusinessException(BusinessExceptionEnum.MEMBER_MOBILE_NOT_EXIST);
        }
        //校验短信验证码
        if (!"8888".equals( code)){
            throw new BusinessException(BusinessExceptionEnum.MEMBER_MOBILE_CODE_EXIST);
        }

        //返回给前端响应数据
        MemberLonginResp memberLonginResp = BeanUtil.copyProperties(memberDB, MemberLonginResp.class);

        //创建一个token,调用自己写的方法
        String token = JwtUtil.createToken(memberLonginResp.getId(), memberLonginResp.getMobile());
        //传入token给前端，返回给前端的token
        memberLonginResp.setToken(token);


        return memberLonginResp;
    }

    /**
     * 根据手机号查询用户信息【方法】
     * @param rep 手机号
     * @return 查询到的用户对象，如果不存在则返回null
     */
    private Member SelectByMobile(String rep) {
        //查找手机号是否存在
        MemberExample memberExample = new MemberExample();
        memberExample.createCriteria().andMobileEqualTo(rep);
        List<Member> members = memberMapper.selectByExample(memberExample);
        //如果手机号不存在
        if (CollUtil.isEmpty( members)){
            return null;

        }else {
            //返回用户对象信息
            return members.get(0);
        }
    }
}
